home *** CD-ROM | disk | FTP | other *** search
- /* isosurf.c */
-
- /*
- * Display an isosurface of 3-D wind speed volume. Use arrow keys to
- * rotate, S toggles smooth shading, L toggles lighting
- * Brian Paul
- */
-
-
-
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- #include "tk.h"
-
-
- GLboolean speed_test = GL_FALSE;
-
- GLenum doubleBuffer;
-
- GLenum smooth = GL_TRUE;
- GLenum lighting = GL_TRUE;
- GLenum depth = GL_TRUE;
-
-
- #define MAXVERTS 10000
-
- static GLfloat verts[MAXVERTS][4];
- static GLfloat norms[MAXVERTS][3];
- static GLint numverts;
-
- static GLfloat xrot;
- static GLfloat yrot;
-
-
-
- static void read_surface( char *filename )
- {
- FILE *f;
-
- f = fopen(filename,"r");
- if (!f) {
- printf("couldn't read %s\n", filename);
- exit(1);
- }
-
- numverts = 0;
- while (!feof(f) && numverts<MAXVERTS) {
- fscanf( f, "%f %f %f %f %f %f",
- &verts[numverts][0], &verts[numverts][1], &verts[numverts][2],
- &norms[numverts][0], &norms[numverts][1], &norms[numverts][2] );
- verts[numverts][3] = 1.0;
- numverts++;
- }
- numverts--;
-
- printf("%d vertices, %d triangles\n", numverts, numverts-2);
- fclose(f);
- }
-
-
-
- static void draw_surface( void )
- {
- GLuint i;
-
- glBegin( GL_TRIANGLE_STRIP );
- for (i=0;i<numverts;i++) {
- glNormal3fv( norms[i] );
- glVertex4fv( verts[i] );
- }
- glEnd();
- }
-
-
-
- static void draw1(void)
- {
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- glPushMatrix();
- glRotatef( yrot, 0.0, 1.0, 0.0 );
- glRotatef( xrot, 1.0, 0.0, 0.0 );
-
- draw_surface();
-
- glPopMatrix();
-
- glFlush();
- if (doubleBuffer) {
- tkSwapBuffers();
- }
- }
-
-
- static void draw(void)
- {
- if (speed_test) {
- for (xrot=0.0;xrot<=90.0;xrot+=10.0) {
- yrot++;
- draw1();
- }
- tkQuit();
- }
- else {
- draw1();
- }
- }
-
-
-
- static void InitMaterials(void)
- {
- static float ambient[] = {0.1, 0.1, 0.1, 1.0};
- static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
- static float position0[] = {0.0, 0.0, 20.0, 0.0};
- static float position1[] = {0.0, 0.0, -20.0, 0.0};
- static float front_mat_shininess[] = {60.0};
- static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
- static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
- static float back_mat_shininess[] = {60.0};
- static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
- static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
- static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
- static float lmodel_twoside[] = {GL_TRUE};
-
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, position0);
- glEnable(GL_LIGHT0);
-
- glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT1, GL_POSITION, position1);
- glEnable(GL_LIGHT1);
-
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
- glEnable(GL_LIGHTING);
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse);
- /*
- glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
- glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
- glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
- */
-
- /*
- glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
- glEnable(GL_COLOR_MATERIAL);
- */
- }
-
-
- void foo(void)
- {
- GLfloat mat_ambient[] = { 0.0, 0,2, 0,0, 1,0 };
- GLfloat mat_diffuse[] = { 0.0, 0.8, 0.0, 1.0 };
- GLfloat mat_specular[] = { 0.8, 0.8, 0.8, 1.0 };
- GLfloat shininess[] = { 5.0 };
-
- GLuint l;
- l = glGenLists(1);
-
- glNewList(l, GL_COMPILE);
-
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT, GL_SHININESS, shininess);
-
- glEndList();
-
- glDeleteLists(l,1); /* This line causes the error */
- }
-
-
-
- static void Init(void)
- {
- glClearColor(0.0, 0.0, 0.0, 0.0);
-
- glShadeModel(GL_SMOOTH);
-
- glEnable(GL_DEPTH_TEST);
-
- InitMaterials();
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- /* gluPerspective(450, 1.0, 0.5, 10.0);*/
- glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 );
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef( 0.0, 0.0, -6.0 );
-
- }
-
-
-
- static void Reshape(int width, int height)
- {
- glViewport(0, 0, (GLint)width, (GLint)height);
- }
-
-
-
- static GLenum Key(int key, GLenum mask)
- {
-
- switch (key) {
- case TK_ESCAPE:
- tkQuit();
- case TK_LEFT:
- yrot -= 15.0;
- break;
- case TK_RIGHT:
- yrot += 15.0;
- break;
- case TK_UP:
- xrot += 15.0;
- break;
- case TK_DOWN:
- xrot -= 15.0;
- break;
- case TK_s:
- smooth = !smooth;
- if (smooth) {
- glShadeModel(GL_SMOOTH);
- } else {
- glShadeModel(GL_FLAT);
- }
- break;
- case TK_l:
- lighting = !lighting;
- if (lighting) {
- glEnable(GL_LIGHTING);
- } else {
- glDisable(GL_LIGHTING);
- }
- break;
- default:
- return GL_FALSE;
- }
- return GL_TRUE;
- }
-
-
-
- static GLenum Args(int argc, char **argv)
- {
- GLint i;
-
- doubleBuffer = GL_TRUE;
-
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-sb") == 0) {
- doubleBuffer = GL_FALSE;
- } else if (strcmp(argv[i], "-db") == 0) {
- doubleBuffer = GL_TRUE;
- } else if (strcmp(argv[i], "-speed") == 0) {
- speed_test = GL_TRUE;
- doubleBuffer = GL_TRUE;
- } else {
- printf("%s (Bad option).\n", argv[i]);
- return GL_FALSE;
- }
- }
- return GL_TRUE;
- }
-
-
-
- void main(int argc, char **argv)
- {
- GLenum type;
-
- read_surface( "isosurf.dat" );
-
- if (Args(argc, argv) == GL_FALSE) {
- tkQuit();
- }
-
- tkInitPosition(0, 0, 400, 400);
-
- type = TK_DEPTH;
- type |= TK_RGB;
- type |= TK_DIRECT;
- type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
- tkInitDisplayMode(type);
-
- if (tkInitWindow("Isosurface") == GL_FALSE) {
- tkQuit();
- }
-
- Init();
-
- tkExposeFunc(Reshape);
- tkReshapeFunc(Reshape);
- tkKeyDownFunc(Key);
- tkDisplayFunc( draw );
- tkExec();
- }
-